# -*- coding:utf-8
# 5370. 设计地铁系统 显示英文描述
# 请你实现一个类 UndergroundSystem ，它支持以下 3 种方法：
#
# 1. checkIn(int id, string stationName, int t)
#
# 编号为 id 的乘客在 t 时刻进入地铁站 stationName 。
# 一个乘客在同一时间只能在一个地铁站进入或者离开。
# 2. checkOut(int id, string stationName, int t)
#
# 编号为 id 的乘客在 t 时刻离开地铁站 stationName 。
# 3. getAverageTime(string startStation, string endStation)
#
# 返回从地铁站 startStation 到地铁站 endStation 的平均花费时间。
# 平均时间计算的行程包括当前为止所有从 startStation 直接到达 endStation 的行程。
# 调用 getAverageTime 时，询问的路线至少包含一趟行程。
# 你可以假设所有对 checkIn 和 checkOut 的调用都是符合逻辑的。也就是说，如果一个顾客在 t1 时刻到达某个地铁站，那么他离开的时间 t2 一定满足 t2 > t1 。所有的事件都按时间顺序给出。

# 字典存储上车信息，下车时将其加入历史记录（起始站：[下车站，乘车时间，次数]）

class UndergroundSystem:

    def __init__(self):
        from collections import defaultdict
        self.checkInTime=defaultdict(list)
        self.intervals=defaultdict(list)

    def checkIn(self, id: int, stationName: str, t: int) -> None:
        #记录上车信心{ID：[上车时间，上车站台]}
        self.checkInTime[id]=[t,stationName]
        # print(self.checkInTime)

    def checkOut(self, id: int, stationName: str, t: int) -> None:
        #弹出下车乘客
        cur = self.checkInTime.pop(id)
        #记录上、下车的区间及乘车时间总和、总次数
        if cur[1] not in self.intervals:
            self.intervals[cur[1]]=[[stationName,t-cur[0],1]]
        else:
            flag=True
            for item in self.intervals[cur[1]]:
                if item[0]==stationName:
                    item[1]+=(t-cur[0])
                    item[2]+=1
                    flag=False
            if flag:self.intervals[cur[1]].append([stationName,t-cur[0],1])
        # print(self.intervals)

    def getAverageTime(self, startStation: str, endStation: str) -> float:
        # 找到对应上、下车区间，返回总时间/总次数
        v=self.intervals[startStation]
        for c in v:
            if c[0]==endStation:
                return c[1]/c[2]
        return -1
